#include "bsp-board.h"
#include "polsys.h"

static bit Register_mBuff1;
static bit Register_mBuff2;

void Board_Sleep(void)
{
    Adc_Disable();
    ADS0 = VREFSEL_1024MV; //选择内部1.024V

    Register_mBuff1 = T1SELEN;
    Register_mBuff2 = T2SELEN;
    T1SELEN = 0;
    T2SELEN = 0; //注意:	T1SELEN�?1"或者T2SELEN�?1"时，MCU将一直处于工作状态，无法进入睡眠

    PAIE = 1;
    // DCIN_INTR_ON;
    // OVAL_INTR_ON;
    // DCIN_OUTPUT_MODE;
    // OVAL_OUTPUT_MODE;
    // DCIN_LOW;
    // OVAL_LOW;
    // DCIN_INPUT_MODE;
    // OVAL_INPUT_MODE;
    PAINTR = 0x18; //PA电平变化中断允许位		1:使能		0:禁止
    CPIOA &= 0xE7;
    PORTA &= 0xE7;
    CPIOA |= 0x18;
    PORTA = PORTA; //采用电平变化唤醒时须在睡眠前读取整个端口状态，否则
    PAIF = 0;

    Wdt_Disable();
    SET_HIRC(IRCF_500K); //睡眠之前 系统时钟 切换�?500KHz 或小�?500KHz（不可大�?00KHz�?-------（这里将Fosc设置�?00KHz�?
    Wdt_Clear();
    asm("nop"); //切换“系统时钟”后，需加至少两个以上的NOP指令，等待时钟稳�?
    asm("nop");
    asm("nop");

    if ((!OVAL) && (!DCIN) && (Btn_IsDown() == Board_ButtonIsDown())) // 休眠之前再判断一次唤醒管脚电平，降低错误休眠概率。
    {
        SLEEP(); //MCU 进入睡眠
    }
    Wdt_Clear(); //MCU唤醒�?需�?清除WDT操作

    //当MCU供电电压“低�?.5V”时，不可使�?6MHz作为“系统时�?�?
    OSCCON = (MCU_FOSC_TRIM_SEL<<1)|(MCU_FSYS_SEL << 4); //唤醒后，“系统时钟”切换到所需“时钟频率”--------（这里将Fosc设置为8MHz）
    asm("nop");    //切换“系统时钟”后，需加至少两个以上的NOP指令，等待时钟稳�?
    asm("nop");
    asm("nop");
    Wdt_Enable(); //开 WDT
    Wdt_Clear(); //MCU唤醒�?需�?清除WDT操作

    Btn_Init2();
    Adc_Enable();
    
    T1SELEN = Register_mBuff1;
    T2SELEN = Register_mBuff2;
}

// PA3 如作为输入引脚时，如果采用下拉电阻，下拉电阻应小于 20K，否则无法
// 判断到低电平（如果一定要使用较大电阻，比如 100K，程序上检测输入状态前
// 需先设置成输出口，并且输出“0”，再切换成输入口）
bool Board_GetDCStatus(void)
{ 
    // DCIN_OUTPUT_MODE;
    // OVAL_OUTPUT_MODE;
    // DCIN_LOW;
    // OVAL_LOW;
    // DCIN_INPUT_MODE;
    // OVAL_INPUT_MODE;
    CPIOA &= 0xE7;
    PORTA &= 0xE7;
    CPIOA |= 0x18;
    if(OVAL||DCIN)
    {
        return true; 
    }
    else
    {
        return false; 
    }   
}